package cn.iocoder.yudao.module.erp.convert.recycle;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.erp.controller.admin.recycle.vo.item.ErpRecycleOrderItemBaseVO;
import cn.iocoder.yudao.module.erp.controller.admin.recycle.vo.order.ErpRecycleOrderCreateReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.recycle.vo.order.ErpRecycleOrderRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.recycle.vo.order.ErpRecycleOrderUpdateReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.recycle.ErpRecycleOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.recycle.ErpRecycleOrderItemDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;
import java.util.Map;

/**
 * ERP 回收订单 Convert
 */
@Mapper
public interface ErpRecycleOrderConvert {

    ErpRecycleOrderConvert INSTANCE = Mappers.getMapper(ErpRecycleOrderConvert.class);

    ErpRecycleOrderDO convert(ErpRecycleOrderCreateReqVO bean);

    ErpRecycleOrderDO convert(ErpRecycleOrderUpdateReqVO bean);

    ErpRecycleOrderRespVO convert(ErpRecycleOrderDO bean);

    List<ErpRecycleOrderRespVO> convertList(List<ErpRecycleOrderDO> list);

    PageResult<ErpRecycleOrderRespVO> convertPage(PageResult<ErpRecycleOrderDO> page);

    ErpRecycleOrderItemDO convert(ErpRecycleOrderItemBaseVO bean);
    
    default PageResult<ErpRecycleOrderRespVO> convertPage(PageResult<ErpRecycleOrderDO> pageResult,
                                                        List<ErpRecycleOrderItemDO> items) {
        Map<Long, List<ErpRecycleOrderItemDO>> itemMap = CollectionUtils.convertMultiMap(items, ErpRecycleOrderItemDO::getOrderId);
        List<ErpRecycleOrderRespVO> voList = CollectionUtils.convertList(pageResult.getList(), order -> {
            ErpRecycleOrderRespVO orderVO = convert(order);
            // 设置对应的订单项
            if (itemMap.containsKey(order.getId())) {
                // 按照 sort 升序排序
                List<ErpRecycleOrderItemDO> orderItems = CollUtil.sort(itemMap.get(order.getId()),
                        (o1, o2) -> o1.getSort().compareTo(o2.getSort()));
                // TODO: 需要设置对应的项
            }
            return orderVO;
        });
        return new PageResult<>(voList, pageResult.getTotal());
    }

    default ErpRecycleOrderRespVO convert(ErpRecycleOrderDO order, List<ErpRecycleOrderItemDO> items) {
        ErpRecycleOrderRespVO orderVO = convert(order);
        // 设置对应的订单项
        if (CollUtil.isNotEmpty(items)) {
            // 按照 sort 升序排序
            List<ErpRecycleOrderItemDO> sortedItems = CollUtil.sort(items,
                    (o1, o2) -> o1.getSort().compareTo(o2.getSort()));
            // TODO: 需要设置对应的项
        }
        return orderVO;
    }

} 